package com.tamecode.flowable;

import org.flowable.engine.*;
import org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.flowable.task.api.Task;
import org.flowable.variable.service.impl.persistence.entity.VariableInstanceEntity;
import org.junit.Test;

import java.util.List;

/**
 * Flowable 配置
 *
 * @Author: LiQiongchao
 * @Date: 2021/8/10 20:34
 */
public class FlowableAPI {

    /**
     * 使用默认加载 Flowable 的配置文件
     */
    @Test
    public void loadConfigTypeOne() {
        /*
        当使用此方式创建 ProcessEngine 时，会从 classpath 下 查找flowable.cfg.xml 的配置文件
         */
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        HolidayRequest.doHolidayRequest(processEngine);
    }


    @Test
    public void queryApiWithSql() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        ManagementService managementService = processEngine.getManagementService();
        TaskService taskService = processEngine.getTaskService();

        // 查询在数据库中进行，因此需要使用数据库中定义的表名与列名。
        // 这需要了解内部数据结构，因此建议小心使用原生查询。数据库表名可以通过API读取，这样可以将依赖关系减到最小。
        List<Task> tasks = taskService.createNativeTaskQuery()
                .sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) +
                        " T WHERE T.NAME_ = #{taskName}")
                .parameter("taskName", "gonzoTask")
                .list();

        long count = taskService.createNativeTaskQuery()
                .sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T1, " +
                        managementService.getTableName(VariableInstanceEntity.class) + " V1 WHERE V1.TASK_ID_ = T1.ID_")
                .count();
    }


    /**
     *
     * 查询 API
     */
    @Test
    public void queryApiTest() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        // 根据名字和变量值查询任务。
        List<Task> list = taskService.createTaskQuery().taskAssignee("kermit")
                .processVariableValueEquals("orderId", "0815")
                .orderByDueDateNullsFirst().asc().list();
    }




}
